package com.sinodata.bsm.center.user;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.jasig.cas.client.authentication.AttributePrincipal;

import com.sino.uam.entity.Department;
import com.sino.uam.entity.DptUserRel;
import com.sino.uam.entity.UserInfo;
import com.sino.uam.rbac.model.AppSystem;
import com.sino.uam.support.UAMFascade;
import com.sinodata.bsm.center.util.web.Struts2Utils;
import com.sinodata.bsm.common.constants.EventConstants;

import flex.messaging.FlexContext;

/**
 * <p>
 * Description: 用户工具类,获取用户信息的唯一入口,系统中不允许在其它代码处调用UAM的方法
 * </p>
 * 
 * @author liulibo
 * @version 6.0
 * 
 * <p>
 * History:
 * 
 * Date Author Version Description
 * ---------------------------------------------------------------------------------
 * 
 * 
 * </p>
 * 
 * @since
 * @see
 */
public class UserUtil {

    private static UserUtil instance = null;

    public static String PURVIEW = "purview";

    UserInfo user = null;

    /**
     * 私有化构造方法
     */
    private UserUtil() {
        user = new UserInfo();
        user.setId("admin");
        user.setPassword("admin");
        user.setFullName("系统管理员");
    }

    /**
     * 单例获取UserUtil对象
     * 
     * @return
     */
    public static UserUtil getInstance() {
        if (instance == null) {
            instance = new UserUtil();
        }
        return instance;
    }

    /**
     * 判断是否是系统管理员
     * 
     * @param id
     * @return
     */
    public boolean isSysAdmin(String id) {
        if ("admin".equals(id)) {
            return true;
        }
        List<Integer> roleIds = UAMFascade.getUserInfoFactory().findRoleIdsByUser(id);
        for (Integer roleId : roleIds) {
            if ("admin".equals(UAMFascade.getRoleFactory().findById(roleId).getCode())) {
                return true;
            }
        }
        return false;
    }

    /**
     * 判断是否是Guest用户或Guest角色用户
     * 
     * @param id
     * @return
     */
    public boolean isGuest(String id) {
        if ("guest".equals(id)) {
            return true;
        }
        List<Integer> roleIds = UAMFascade.getUserInfoFactory().findRoleIdsByUser(id);
        for (Integer roleId : roleIds) {
            if ("guest".equals(UAMFascade.getRoleFactory().findById(roleId).getCode())) {
                return true;
            }
        }
        return false;
    }

    /**
     * 通过账号获取用户信息,从缓存中获取，缓存中不存在则调用PASM方法实时获取，账号不存在返回null
     * 
     * @param id
     *            待查询的账号
     * @return UserInfo 用户对象
     */
    public UserInfo getUserById(String id) {
        //        UserInfo u = null;
        //        if (EventConstants.REMARKER_SYSTEM.equalsIgnoreCase(id)) {
        //            // 固定好的系统用户，单例
        //            u = new UserInfo();
        //            u.setId(EventConstants.REMARKER_SYSTEM);
        //            u.setFullName("系统");
        //            return u;
        //        }
        //        u = UAMFascade.getUserInfoFactory().findById(id);
        //        return u;

        return user;
    }

    /**
     * 获取当前用户的用户名
     * @return
     */
    public String getCurrentUserName() {
        //        String id = getCurrentUserId();
        //        UserInfo user = UAMFascade.getUserInfoFactory().findById(id);
        if (user != null) {
            return user.getFullName();
        } else {
            return "未知用户";
        }

    }

    /**
     * 获取当前登录用户信息，如果仅需要当前登录用户账号请调用getCurrentUserId方法。
     * 
     * @return UserInfo 用户对象
     */
    public UserInfo getCurrentUser() {
        //        String id = getCurrentUserId();
        //        return UAMFascade.getUserInfoFactory().findById(id);

        return user;
    }

    /**
     * 获取当前登录用户账号
     * 
     * @return
     */
    public String getCurrentUserId() {
        //        AttributePrincipal principal = (AttributePrincipal) Struts2Utils.getRequest().getUserPrincipal();
        //        String userId = principal.getName();
        //        return userId;

        return user.getId();
    }

    /**
     * 获取当前登录用户账号(BlazeDS请求方式)
     * @return
     */
    public String getCurrentUserIdByFlex() {
        //        AttributePrincipal principal = (AttributePrincipal) FlexContext.getHttpRequest().getUserPrincipal();
        //        String userId = principal.getName();
        return user.getId();
    }

    /**
     * 获得所有部门信息
     * 
     * @return
     */
    public Collection<Department> getAllDepartment() {

        return UAMFascade.getDepartmentFactory().findAll();
    }

    /**
     * 获得部门用户关联数据
     * @return
     */
    public List<DptUserRel> getDptUserRel() {

        return UAMFascade.getUserInfoFactory().getDptUserRelList();
    }

    /**
     * 根据部门Id获得所有子部门信息
     * 
     * @return
     */
    public List<Department> getDepartmentListByParentId(Integer departmentId) {
        List<Department> list = new ArrayList<Department>();
        Collection<Department> allDepartments = getAllDepartment();
        for (Department department : allDepartments) {
            if (department.getParentId() != null && department.getParentId().equals(departmentId)) {
                list.add(department);
            }
        }
        return list;
    }

    /**
     * 根据部门Id查询其下所有用户
     * 
     * @param departmentId
     * @return
     */
    public List<UserInfo> getUserByDeptId(Integer departmentId) {
        List<UserInfo> listUserInfo = new ArrayList<UserInfo>();
        List<String> list = UAMFascade.getUserInfoFactory().findUserIdByDeptId(departmentId);
        for (String dptId : list) {
            UserInfo userInfo = UAMFascade.getUserInfoFactory().findById(dptId);
            listUserInfo.add(userInfo);
        }

        return listUserInfo;
    }

    /**
     * 放置权限对象数据
     * 
     * @param appSystem
     */
    public void putPurviewObject(AppSystem appSystem) {
        // AppSystemCache.getInstance().put(appSystem);
    }

    /**
     * 获取所有用户数据MAP集合
     * @return
     */
    public Map<String, UserInfo> getAllUsers() {
        return UAMFascade.getUserInfoFactory().getUserMap();
    }

    /**
     * 测试
     * 
     * @param arg0
     */
    public static void main(String[] arg0) {

    }

}
